// webpack()方法的实现代码
const Compiler = require("./compiler");
function webpack(options) {
  // 合并参数:1.来自webpack.config.js;2.shell语句参数
  const mergeOptions = _mergeOptions(options);
  // 创建compiler对象
  const compiler = new Compiler(mergeOptions);
  // 加载插件
  _loadPlugin(options.plugins, compiler);


  return compiler;
}

/** 合并参数（webpack.config.js和shell参数）
 * @description 注：shell参数获取方式:process.argv.slice(2)
 * @author luyaxiang
 * @date 2021/12/15
 * @param {*} options
 * @return {*} 
 */
function _mergeOptions(options) {
  const shellOptions = process.argv.slice(2).reduce(() => {
    // argv -> --mode=production
    const [key, value] = argv.split('=');
    if (key && value) {
      const parseKey = key.slice(2); // 把前面的 -- 去掉
      option[parseKey] = value;
    }
    return option;
  }, {})
  return {
    ...options,
    ...shellOptions,
  }
}

/**
 * 加载插件（Plugins）
 * @description
 * @author luyaxiang
 * @date 2021/12/15
 * @param {*} plugins plugins配置
 * @param {*} compiler compiler对象
 */
function _loadPlugin(plugins, compiler) {
  if (plugins && Array.isArray(plugins)) {
    plugins.forEach(plugin => {
      plugin.apply(compiler); // 所有的plugin类都必须存在一个apply方法
    })
  }
}

module.exports = webpack;
